package controlller;

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;

import model.Cheque;
import model.Cliente;
import model.ContaCorrente;
import model.Doc;
import util.Communication;
import util.MaloteHandler;

public class MeuBanco
{
	private static final Integer MENU = 0;
	private static final Integer CADASTRAR_CLIENTE = 1;
	private static final Integer CADASTRAR_CC = 2;
	private static final Integer CADASTRAR_CHEQUE = 3;
	private static final Integer CADASTRAR_DOC = 4;
	private static final Integer ENVIAR_BC = 5;
	private static final Integer SAIR = 6;
	private static Integer acao = MENU;
	@SuppressWarnings("unused")
	private static Communication communicator;

	public static void main(String[] args)
	{

		try
		{
			communicator = new Communication(1042);

		} catch (IOException e)
		{
			e.printStackTrace();
		}

		while (acao != SAIR)
		{
			if (acao == MENU)
				menu();
			else if (acao == CADASTRAR_CLIENTE)
			{
				cadastrarCliente();
				acao = MENU;
			} else if (acao == CADASTRAR_CC)
			{
				cadastrarCC(new Cliente());
				acao = MENU;
			} else if (acao == CADASTRAR_CHEQUE)
			{
				cadastrarCheque();
				acao = MENU;
			} else if (acao == CADASTRAR_DOC)
			{
				cadastrarDoc();
				acao = MENU;
			} else if (acao == ENVIAR_BC)
			{
				enviarBC();
				acao = MENU;
			} else if (acao == SAIR)
				System.exit(0);
			else
			{
				System.out.println("Acao invalida!\n");
				acao = MENU;
			}
		}
	}

	private static void menu()
	{
		int opcao;

		System.out.println("********* Sistema Bancario 'Meu Banco' ******\n");
		System.out.println("O que deseja fazer?\n");
		System.out.println("[1] Cadastrar um cliente");
		System.out.println("[2] Cadastrar uma conta corrente");
		System.out.println("[3] Emitir um cheque");
		System.out.println("[4] Emitir um DOC");
		System.out.println("[5] Enviar remessa ao Banco Central");
		System.out.println("[6] Sair");
		System.out.println("\n*******************************************\n");
		System.out.print("Digite a opcao desejada: ");

		Scanner scanner = new Scanner(System.in);

		try
		{
			opcao = scanner.nextInt();

			if (opcao < 1 || opcao > 6)
				System.out.println("Opcao Invalida!\n");
			else
				acao = opcao;
		} catch (Exception e)
		{
			System.out.println("Opcao invalida!\n");
		}

		
	}

	private static String cadastrarCliente()
	{
		String msg = "";
		String input = "";
		Scanner scanner = new Scanner(System.in);
		Cliente cliente = new Cliente();

		System.out.println("\nForneca os dados do cliente:");

		System.out.print("Nome [Nome Sobrenome]: ");
		input = scanner.nextLine();
		cliente.setNome(input);
		input = null;

		System.out.print("CPF [104011677]: ");
		input = scanner.nextLine();
		cliente.setCpf(Integer.parseInt(input));

		System.out.print("Identidade [12.809.817-9]: ");
		input = scanner.nextLine();
		cliente.setIdentidade(input);
		input = null;

		System.out.print("Data de Nascimento [dd/mm/aaaa]: ");
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		input = scanner.nextLine();
		try
		{
			cliente.setDataNascimento(df.parse(input));
		} catch (ParseException e)
		{
			System.out.println("Erro ao parsear string de data!");
		}

		System.out.print("Logradouro [Avenida Brasil]: ");
		input = scanner.nextLine();
		cliente.setLogradouro(input);

		System.out.print("Numero [12]: ");
		input = scanner.nextLine();
		cliente.setNumero(Integer.parseInt(input));

		System.out.print("Complemento [apto. 201]: ");
		input = scanner.nextLine();
		cliente.setComplemento(input);

		System.out.print("Cep [20531-090]: ");
		input = scanner.nextLine();
		cliente.setCep(input);

		System.out.print("Bairro [Tijuca]: ");
		input = scanner.nextLine();
		cliente.setBairro(input);

		System.out.print("Cidade [Rio de Janeiro]: ");
		input = scanner.nextLine();
		cliente.setCidade(input);

		System.out.print("Estado [RJ]: ");
		input = scanner.nextLine();
		cliente.setEstado(input);

		System.out.print("Pais [Brasil]: ");
		input = scanner.nextLine();
		cliente.setPais(input);

		System.out.print("Telefone [21 55555555]: ");
		input = scanner.nextLine();
		cliente.setTelefone(input);

		// Cadastrar conta corrente
		cadastrarCC(cliente);

		cliente.generateXMLFile();
				
		return msg;
	}

	private static String cadastrarCheque()
	{
		String msg = "";
		String input = "";

		Scanner scanner = new Scanner(System.in);
		Cheque cheque = new Cheque();

		System.out.print("Numero do cheque: ");
		input = scanner.nextLine();
		cheque.setNumero(Long.parseLong(input));

		System.out.print("Nome do emissor: ");
		input = scanner.nextLine();
		cheque.setNomeEmissor(input);

		System.out.print("Numero do banco emissor: ");
		input = scanner.nextLine();
		cheque.setBancoEmissor(input);

		System.out.print("Numero da agencia do emissor: ");
		input = scanner.nextLine();
		cheque.setAgenciaEmissor(Integer.parseInt(input));

		System.out.print("Numero da conta corrente do emissor: ");
		input = scanner.nextLine();
		cheque.setContaCorrenteEmissor(Integer.parseInt(input));

		System.out.print("Numero do banco favorecido: ");
		input = scanner.nextLine();
		cheque.setBancoFavorecido(input);

		System.out.print("Numero da agencia do favorecido: ");
		input = scanner.nextLine();
		cheque.setAgenciaFavorecido(Integer.parseInt(input));

		System.out.print("Numero da conta corrente do favorecido: ");
		input = scanner.nextLine();
		cheque.setContaCorrenteFavorecido(Integer.parseInt(input));

		System.out.print("Data para compensacao [dd/mm/aaaa]: ");
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		input = scanner.nextLine();
		try
		{
			cheque.setData(df.parse(input));
		} catch (ParseException e)
		{
			System.out.println("Erro ao parsear string de data!");
		}

		System.out.print("Valor do cheque: ");
		input = scanner.nextLine();
		cheque.setValor(Double.parseDouble(input));
		cheque.setStatus("Pendente");

		cheque.generateXMLFile();
			
		return msg;
	}

	private static String cadastrarDoc()
	{
		String msg = "";
		String input = "";
		Scanner scanner = new Scanner(System.in);
		Doc doc = new Doc();

		System.out.print("Numero do Doc: ");
		input = scanner.nextLine();
		doc.setNumero(Long.parseLong(input));

		System.out.print("Nome do emissor: ");
		input = scanner.nextLine();
		doc.setNomeEmissor(input);

		System.out.print("Numero do banco emissor: ");
		input = scanner.nextLine();
		doc.setBancoEmissor(input);

		System.out.print("Numero da agencia do emissor: ");
		input = scanner.nextLine();
		doc.setAgenciaEmissor(Integer.parseInt(input));

		System.out.print("Numero da conta corrente do emissor: ");
		input = scanner.nextLine();
		doc.setContaCorrenteEmissor(Long.parseLong(input));

		System.out.print("Numero do banco favorecido: ");
		input = scanner.nextLine();
		doc.setBancoFavorecido(input);

		System.out.print("Numero da agencia do favorecido: ");
		input = scanner.nextLine();
		doc.setAgenciaFavorecido(Integer.parseInt(input));

		System.out.print("Numero da conta corrente do favorecido: ");
		input = scanner.nextLine();
		doc.setContaCorrenteFavorecido(Long.parseLong(input));

		System.out.print("Data para compensacao [dd/mm/aaaa]: ");
		DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
		input = scanner.nextLine();
		try
		{
			doc.setData(df.parse(input));
		} catch (ParseException e)
		{
			System.out.println("Erro ao parsear string de data!");
		}

		System.out.print("Valor do cheque: ");
		double valorCheque = scanner.nextDouble();
		doc.setValor(valorCheque);

		doc.generateXMLFile();
		
		return msg;
	}

	private static String cadastrarCC(Cliente cliente)
	{
		String msg = "";
		String input = "";
		Scanner scanner = new Scanner(System.in);
		ContaCorrente cc = new ContaCorrente();

		System.out.print("Numero da conta corrente [1001]: ");
		input = scanner.nextLine();
		cc.setNumero(Integer.parseInt(input));

		if (cliente.getCpf() != null)
			cc.setCliente(cliente.getCpf());
		else
		{
			System.out.print("CPF do Cliente [104066789]: ");
			input = scanner.nextLine();
			cc.setCliente(Integer.parseInt(input));
		}

		System.out.print("Agencia [8976]: ");
		input = scanner.nextLine();
		cc.setAgencia(Integer.parseInt(input));

		System.out.print("Banco [Banco do Brasil]: ");
		input = scanner.nextLine();
		cc.setBanco(input);

		if (cliente.getCpf() != null)
		{
			cliente.setContaCorrente(cc.getNumero());
			cliente.setAgencia(cc.getAgencia());
			cliente.setBanco(cc.getBanco());
		}

		cc.generateXMLFile();
		
		return msg;
	}

	private static String enviarBC()
	{
		MaloteHandler maloteHandler = new MaloteHandler(communicator);
		
		maloteHandler.generate();
		maloteHandler.compileAndTransform();
		maloteHandler.send();
		
		return "";
	}

}
